手撸CAPL(二) 您所在的位置:网站首页 osek网络管理 任何报文都能唤醒 手撸CAPL(二)

手撸CAPL(二)

2024-06-09 21:00| 来源: 网络整理| 查看: 265

前言确认模拟节点发送机制节点排序节点加入并建环节点丢失节点跳过测试例子总结 ———————————————— 闲暇之际,听到不知名网友呼我关于OSEK的建环机制用CAPL怎么做? 我会的有以下三种:

利用.dll调用,这得看函数解析,对新手不太友好。

建立network node仿真节点,每个仿真节点都有一个完整的OSEK机制,即相互独立运作建环,睡眠唤醒等;编写测试用例简单;这得有开发基础及逻辑清晰的头脑,再花费亿点点时间(小七用的这种)。

只满足基本的建环与丢失,代码量少,需要迎合测试用例(推荐)。

今天讲第3种。 在这里插入图片描述 新建工程,Insert CAPL Test Module > osek.can

确认模拟节点 以0x604为ECU节点,0x601,0x605,0x603,0x650,0x67F为模拟节点。 variables{ dword ecu_node_id = 0x604;//ECU节点 dword node_id[5] = {0x601,0x605,0x603,0x650,0x67f};//模拟节点5个 } 发送机制 初步模拟出ECU节点运行,直到跛行状态持续 variables{ message 0x001 g_Tx = {dlc=0x08}; dword ecu_node_cycle = 0;//周期 msTimer TsingleNode;//模拟osek管理发送机制 int rxLimit_sum = 4,rxLimit_n = 0; } on timer TsingleNode//模拟ECU节点的定时器 { if(ecu_node_cycle == 0) { ecu_node_cycle = 100; g_Tx.byte(1) = 0x01; } else if(ecu_node_cycle == 100) { ecu_node_cycle = 260; g_Tx.byte(1) = 0x02; } else if(ecu_node_cycle == 260 || ecu_node_cycle == 1000) { rxLimit_n++; if(rxLimit_n >= rxLimit_sum + 1) { ecu_node_cycle = 1000; g_Tx.byte(1) = 0x04; } else { if(rxLimit_n == rxLimit_sum) { ecu_node_cycle = 1000; g_Tx.byte(1) = 0x01; } else { ecu_node_cycle = 100; g_Tx.byte(1) = 0x01; } } } g_Tx.id = ecu_node_id; g_Tx.byte(0) = ecu_node_id - node_id_min; output(g_Tx); setTimer(TsingleNode,ecu_node_cycle); } 效果 在这里插入图片描述 节点排序 声明变量数组按ID大小,从小到大存储当前模拟节点及ECU 节点 void alignNodes(byte sim_node_n, byte node_behavior)//排列节点id大小,只有加入和丢失两种操作。 { dword value; int Tempi,Tempj,Tempk; if(node_behavior != gSim_on && node_behavior != gSim_out)//加入和丢失两种操作 return; if(sim_node_n != 0xFF)//单个节点 { if(node_behavior == gSim_on)//模拟节点加入,要重新排列发送顺序 { for (Tempi = 0; Tempi for (Tempi = 0; Tempi // writeEx(-3,0,"0x%x节点丢失",node_id[sim_node_n-1]); for(Tempj = Tempi+1; Tempj cur_node_id_sum = 0; cur_node_id_n = 0; } break; } } } for (Tempi = 0; Tempi if (cur_node_id[Tempi] > cur_node_id[Tempj]) { value = cur_node_id[Tempi]; cur_node_id[Tempi] = cur_node_id[Tempj]; cur_node_id[Tempj] = value; } } } } else//所有节点都需要操作 { for (Tempk = 1; Tempk if(node_behavior == gSim_on)//加入 { sendAlive(sim_node_n);//单个节点加入,先声明,发送Alive sendRing(sim_node_n,gNMStateCode_Ring);//再发送ring } else if(node_behavior == gSim_out)//丢失 { if(cur_node_id_sum gNMStateCode = gNMStateCode_Ring;//建环时,满足睡眠条件->不满足睡眠条件 } } else//所有节点 { for (Tempk = 1; Tempk write("当前所有节点[%d] %x",cur_node_id_sum,cur_node_id[0]); for (Tempi = 1; Tempi gNMStateCode = msg_type; if(msg_type == gNMStateCode_sleepAck)//模拟节点发送置1的ack位/32 { cancelTimer(TringOperation); g_Tx.id = node_id[sim_node_n-1]; g_Tx.byte(0) = desNodeAddress(node_id[sim_node_n-1]); g_Tx.byte(1) = gNMStateCode; output(g_Tx); } else//02/12/ { if(cur_node_id_sum NewTestCase0();//ECU节点发送机制 NewTestCase1();//所有节点建环并丢失 NewTestCase2();//单个节点建环并丢失 NewTestCase3();//三个节点建环并丢失后继节点 NewTestCase4();//三个节点建环跳过ECU节点 testWaitForMeasurementEnd(10); stop(); } 总结

选择合适自己的写脚本的方式,能事半功倍!祝福各位学习CANoe的同学能早日毕业! 有不完善的地方欢迎留言或加我vx补充。 请输入公众号:总线网络。关注我,获取汽车网络开发及测试方面资料,更新干货! 分享总线开发知识 分享CAN/CANFDLIN/ETH等网络资料 分享CANoe/TSMaster/PCAN等设备工具使用 分享UDS/NM/Bootloader测试用例等 一起来学习,进步,交流吧! 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有